介绍UE4 Landscape通过Normal计算TangentToLocal矩阵 您所在的位置:网站首页 ue4 gps 介绍UE4 Landscape通过Normal计算TangentToLocal矩阵

介绍UE4 Landscape通过Normal计算TangentToLocal矩阵

2023-04-22 12:09| 来源: 网络整理| 查看: 265

VertexFactoryGetPerPixelTangentBasis

先看下计算Tangent到Local空间的Shader代码

float3x3 VertexFactoryGetPerPixelTangentBasis(FVertexFactoryInterpolantsVSToPS Interpolants) { float3x3 Result; #if PIXELSHADER || RAYHITGROUPSHADER || COMPUTESHADER #if FEATURE_LEVEL >= FEATURE_LEVEL_SM4 float4 SampleValue = Texture2DSample(LandscapeParameters.NormalmapTexture, LandscapeParameters.NormalmapTextureSampler, Interpolants.WeightHeightMapTexCoord.zw); #else float4 SampleValue = Texture2DSample(LandscapeParameters.NormalmapTexture, LandscapeParameters.NormalmapTextureSampler, Interpolants.WeightMapTexCoord); #endif #if WEBGL float2 SampleNormal = float2(SampleValue.b, SampleValue.a) * float2(2.0,2.0) - float2(1.0,1.0); #else float2 SampleNormal = float2(SampleValue.b, SampleValue.a) * float2(2.0,2.0) - float2(1.0,1.0); #endif float3 WorldNormal = float3( SampleNormal, sqrt(max(1.0-dot(SampleNormal,SampleNormal),0.0)) ); Result = CalcTangentBasisFromWorldNormal(WorldNormal); #endif return Result; }

先从贴图里将Landscape的Normal Texture里Sample出来,NormalTexture像素和Landscape每个Vertex是对应的。SamplerState使用了Bilinear过滤。

............................................... if (NormalmapTexture) { LandscapeParams.NormalmapTexture = NormalmapTexture->TextureReference.TextureReferenceRHI; LandscapeParams.NormalmapTextureSampler = TStaticSamplerState::GetRHI(); } ...............................................

WorldNormal这个变量名字是不准确的,这个实际是LocalNormal (局部空间的Normal,因为没有乘LocalToWorld矩阵)

CalcTangentBasisFromWorldNormal

先看下Shader代码

float3x3 CalcTangentBasisFromWorldNormal(float3 Normal) { float3 LocalTangentX = normalize(float3(Normal.z, 0, -Normal.x)); float3 LocalTangentY = cross(Normal, LocalTangentX); float3x3 LocalToTangent = float3x3(LocalTangentX,LocalTangentY,Normal); return LocalToTangent; }

第一句代码 float3 LocalTangentX = normalize(float3(Normal.z, 0, -Normal.x));,这个怎么理解? 这个实际是先将Normal Vector投影到ZX平面,然后再围绕Y轴逆时针旋转了90度,最后正规化。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0Cm1R16Q-1653466392564)(https://km.woa.com/gkm/api/img/cos-file-url?url=https%3A%2F%2Fkm-pro-1258638997.cos.ap-guangzhou.myqcloud.com%2Ffiles%2Fphotos%2Fpictures%2F202204%2F1649919586-8693-6257c662d442f-587161.png&is_redirect=1)]

LocalTangentY通过Normal和LocalTangentX的叉积得到。 最后放入到3x3矩阵组成, Tangent到Local的变换矩阵(可以参考Change of basis in Linear Algebra, Unreal Engine用的是行矩阵,文章和书里一般用列矩阵) 。

这样计算出来的Tangent Basis坐标,Tangent和贴图U方向是对齐的,BiTangent和V方向是对齐的。 (切线空间(Tangent Space)完全解析 ) 在这里插入图片描述

在这里插入图片描述



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有